#include "environment.h"
#include "context.h"


//WORD_SIZE 在assembly.c里面重复定义过,以后考虑去掉
static  const int WORD_SIZE = 4;

// 开辟一个函数里面的局部变量应占用的内存,不是全局变量
void new_scope(Context *ctx){
    //先清空函数里面的局部变量应占用的内存
    environment_free(ctx->env);
    //然后再给函数里面的局部变量开辟内存
    ctx->env=envionment_new();
   //开辟函数内变量内存后，指针移动到新的栈顶
    ctx->stack_offset = -1*WORD_SIZE;

}
int *func(void){
    int a = 4; //局部变量属于盏变量,
    return &a;
}
void stackMemory(){
/*
动态分配给局部指针变量的内存属于栈内存，属于脏内存，需要手动释放，否则迟早会耗尽，导致内存溢出，编译器会崩溃
*/
   int *p  = NULL;
   p = func()
   printf("p=%p\n")

}
//初始化开辟函数所在文件占用的内存空间
Context *new_context(){
     Context *ctx= malloc(sizeof(Context));
     /*
     malloc 开辟的内存是堆内存，返回的是void *类型指针，是本次申请的内存空间的首字节地址
     用完后，必须手动使用free函数释放，否则堆内存无法释放， 名存实亡，尽管以前的程序不用了，但为其分配的内存空间还在占用，这就是内存溢出， 栈或堆内存一样都需要手动释放内存。
     开发编译器时，尤其小心这点
     
     */
     //内存堆栈指针归零
     ctx-> stack_offset = 0;
     ctx->env= NULL;
     ctx->label_count = 0;
     return ctx;

}

//清空当前上下文占用的内存
void context_free(Context *ctx){
    environment_free(ctx->env);
    free(ctx);
}